Software application development is a challenging undertaking. Programmers use a number of complex tools to build and test programs. FIG. 2 shows an overview of a typical software development process. A programmer creates a source code file 200, which is usually in a human-readable, text form. Source code file 200 passes through a translation process known as compilation 205 and an object code file 210 is produced. Object code files are usually not human-readable, and usually contain instructions and data to cause a programmable processor to perform desired actions, along with information to permit further processing by other software development tools. A large software application may have several separate source files 215, 230, each of which may pass through a compilation process 220, 235 to produce corresponding object files 225 and 240. Subsequently, object files 210, 225 and 240 pass through a linking process 250 to produce an executable file 255. In addition to object files 210, 225 and 240, instructions from a library 245 may also be used by the linking process to prepare executable file 255. Executable file 255 contains data and instructions to cause a programmable processor to perform the actions of the software application that the programmer has described in source code files 200, 215 and 230.
Source code can be written in a wide variety of computer programming languages. Some popular programming languages are C, C++, Java and Perl. C and C++ are compiled languages: they are usually translated through the compiling and linking process into sequences of machine instructions that are directly executed by a microprocessor or similar programmable processing device. Java is a bytecode language: programs written in Java are usually translated into codes that control the operation of a “virtual machine” (“VM”), which is itself a software application implemented as a sequence of machine instructions that are directly executed by a microprocessor. Perl is an interpreted language: a program known as an interpreter processes the source code file directly, converts it to an internal form, and executes it. However, hybrid sets of software development tools can be used, for example, to interpret C programs or compile Java and Perl programs into machine instruction sequences.
Compilation, the process of turning a program in a first or “source” language, into a sequence of executable instructions, is itself a complicated process. Programming languages are often designed to make it easier for programmers to express intricate logical operations, while programmable processors and VMs operate on sequences of relatively simple executable instructions or codes that are chosen for their ease of implementation in hardware circuitry. A simple compiler can translate source code into a basic sequence of executable instructions, but the sequence may be inefficient in terms of memory utilization and/or execution speed. Optimizing compilers use a wide range of techniques to generate improved sequences of executable instructions that retain the logical functionality expressed by the source program. Optimizing techniques are an active area of research in computer science.
Optimizing compilers frequently offer programmers the opportunity to suggest useful sorts of optimizations to apply. For example, a programmer writing an application for an embedded system with a small memory might direct the compiler to produce a short program, even at the expense of some execution inefficiency. On the other hand, an application intended to run on a system with a large amount of memory might be compiled to use fast-executing instruction sequences, even when such sequences consume extra memory. Some optimization techniques may not consistently produce faster, smaller, or otherwise better code in all circumstances, so a programmer may have to spend time tweaking compiler operational controls (e.g. command line parameters, control files, etc.) to achieve acceptable results for an individual application, or for individual source code modules within an application. Methods to refine and automate the search for compiler control parameters that achieve better results for a software application may be of value in this field.